package app.inmos.functions.json;


import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import app.inmos.constants.Constantes;
import app.inmos.exception.ImagenNoEncontradaException;
import app.inmos.model.MapaGoogle;
import app.inmos.model.Propiedad;
import app.inmos.model.Publicacion;
import app.inmos.utils.ImageUtils;
/**
 * Clase que se utiliza para obtener los datos de la Publicacion mediante JSON.
 * @author Lisandro
 *
 */
public class PublicacionUtilsJSON extends BaseUtilsJSON{
	
	
	private static PublicacionUtilsJSON publicacionUtils;
	
	private List<Publicacion> publicacionesDestacadas= new ArrayList<Publicacion>();
	
	/**
	 * Singleton de PublicacionUtils
	 * @return
	 */
	public static PublicacionUtilsJSON getInstance() {
		
		if (publicacionUtils == null) {
			publicacionUtils = new PublicacionUtilsJSON();
		}
		return publicacionUtils;
		
	}
	
	public PublicacionUtilsJSON(){
		
		//setPublicacionesDestacadas(getPublicaciones(getEstructuraJSON()));
		
	}
	
	public  String getEstructuraJSON() {
		
		return obtenerEstructuraJSON();
		
		
	}

	/**
	 * Se obtienen todas las publicaciones destacadas.
	 * @param pEstructuraJSON
	 * @return
	 */
	public List<Publicacion>getPublicaciones(String pEstructuraJSON){
		
	    JSONArray jsonArray;
	    Publicacion publicacion=null;
	    List<Publicacion>listaPublicaciones =new ArrayList<Publicacion>();	
		
	    try {
			
		
		 jsonArray = new JSONArray(pEstructuraJSON);
	
 	      // Recorremos el array con los elementos cities
 	     for(int i = 0; i < jsonArray.length(); i++) {
 	    	 
 	        JSONObject publicacionJSON = jsonArray.getJSONObject(i);
 	        publicacion= getDevolverPublicacion(publicacionJSON);
 	        
 	        listaPublicaciones.add(publicacion);
 	        
 	        
 	     }
 	     
		} catch (JSONException e) {
			
			e.printStackTrace();
		}
         
		return listaPublicaciones;
	}

	
	/**
	 * Se arma el objeto 'Publicacion' con la estructura JSON correspondiente.
	 * @param pJSONObject
	 * @return
	 */
	public Publicacion getDevolverPublicacion(JSONObject pJSONObject){
		
		Publicacion pub = new Publicacion();
		
		
		try {
	
		
	    	pub.setIdPublicacion(Integer.valueOf(pJSONObject.getString("idpublicacion")));
	    	pub.setOperacion(pJSONObject.getString("operacion"));
	    	pub.setTitulo(pJSONObject.getString("titulo"));
	    	if(!(pJSONObject.getString("moneda").equals("0")||(pJSONObject.getString("moneda").equals("1")))){
	    		pub.setMoneda((pJSONObject.getString("moneda")));
	    		
	    	}
	    	else{
	    		
			   pub.setMoneda((pJSONObject.getString("moneda").equals("0"))?"$":"u$s");
	    	}
	    	
			pub.setMonto((pJSONObject.getString("monto").equals("0"))?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("monto"));
			
			Propiedad prop= crearPropiedad(pJSONObject);
			
			
			
			try {
 				
 				 ImageUtils.getInstance().obtenerImagen(prop.getPathImagenPrincipal());
 				 prop.setPathImagenDefinitiva(prop.getPathImagenPrincipal());
 				 
			 }
			
             catch(ImagenNoEncontradaException e){

		        	prop.setPathImagenDefinitiva(prop.getPathSinImagen());
		        	e.printStackTrace();
            	 
             }        
			//se asigna la propiedad a la publicacion
			pub.setPropiedad(prop);
		
			
			
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return pub;
		
	}


	public Propiedad crearPropiedad(JSONObject pJSONObject){
		
		Propiedad prop=new Propiedad();
		
		try{
			
			prop.setIdPropiedad(Integer.valueOf(pJSONObject.getString("idpropiedad")));
			prop.setDireccion(pJSONObject.getString("direccion").equals("")? Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("direccion"));
			prop.setAntiguedad(pJSONObject.getString("antiguedad").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("antiguedad"));
			prop.setCantDormitorios(pJSONObject.getString("cantDormitorios")!=null?Constantes.MSJ_INFO_NO_POSEE:pJSONObject.getString("cantDormitorios"));
			prop.setDescripcion(pJSONObject.getString("descripcion").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("descripcion"));
			prop.setCochera(pJSONObject.getString("cochera").equals("0")?Constantes.MSJ_INFO_NO_POSEE:Constantes.MSJ_INFO_POSEE);
			prop.setPatio(pJSONObject.getString("patio").equals("0")?Constantes.MSJ_INFO_NO_POSEE:Constantes.MSJ_INFO_POSEE);
			prop.setUbicacion(pJSONObject.getString("ubicacion")!=null?pJSONObject.getString("ubicacion"):Constantes.MSJ_INFO_NO_DISPONIBLE);
	        prop.setEstado(pJSONObject.getString("estado").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("estado"));
	        prop.setPatio(pJSONObject.getString("patio").equals("0")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("patio"));
	        prop.setTipoPropiedad(pJSONObject.getString("tipoPropiedad").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("tipoPropiedad"));
	        prop.setSuperificieLote(pJSONObject.getString("superficieLote").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("superficieLote"));
			prop.setMontoExpensas((pJSONObject.getString("montoExpensas").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("montoExpensas")));
			prop.setPatio(pJSONObject.getString("terraza").equals("0")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("terraza"));
			prop.setBalcon(pJSONObject.getString("balcon").equals("0")?Constantes.MSJ_INFO_NO_POSEE:Constantes.MSJ_INFO_POSEE);
			prop.setMedidas(pJSONObject.getString("medidas").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("medidas"));
			prop.setCotizacion(pJSONObject.getString("cotizacion").equals("0")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("cotizacion"));
			prop.setCantBanios(pJSONObject.getString("cantBanios")!=null?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("cantBanios"));
			prop.setSupCubierta(pJSONObject.getString("supCubierta").equals("")?Constantes.MSJ_INFO_NO_DISPONIBLE:pJSONObject.getString("supCubierta"));
			prop.setDireccion(pJSONObject.getString("direccion")!=null?pJSONObject.getString("direccion"):Constantes.MSJ_INFO_NO_DISPONIBLE);
			
			//Se setea el mapa de Google a la propiedad
			
			MapaGoogle mapaGoogle= new MapaGoogle();
			mapaGoogle.setLatitud((pJSONObject.getString("latitud")!=null?pJSONObject.getString("latitud"):null));
			mapaGoogle.setLongitud((pJSONObject.getString("longitud")!=null?pJSONObject.getString("longitud"):null));
			mapaGoogle.setDescripcion((pJSONObject.getString("texto")!=null?pJSONObject.getString("texto"):null));
			prop.setMapaGoogle(mapaGoogle);
			
	    	return prop;
		
		} catch (JSONException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	/**
	 * Se obtiene la estructura String de la publicacion
	 * @return
	 */
	public String obtenerEstructuraJSON(){
	  	   
		//TODO Esta url se debe leer de un fuente externo  
		return obtenerStringJSONConURL("http://10.0.2.2/inmo_project_contreras/app/json/getPublicaciones.php");
			
	}
	
	/**
	 * Se utiliza para obtener las publicaciones con filtro
	 * @param pUrlFiltro
	 * @return
	 */
	public List<Publicacion>getPublicacionesConFiltro(String pUrlFiltro){
		
		
		return getPublicaciones(obtenerStringJSONConURL("http://10.0.2.2/inmo_project_contreras/app/json/getPropiedadesConFiltro.php" + pUrlFiltro));
				
		
	}
	
	public List<Publicacion>getPublicacionesDestacadasEnVenta(){
		
		return getPublicaciones(obtenerStringJSONConURL("http://10.0.2.2/inmo_project_contreras/app/json/getPublicacionesDestacadasVenta.php"));
		
	}
	
    public List<Publicacion>getPublicacionesDestacadasEnAlquiler(){
		
		return getPublicaciones(obtenerStringJSONConURL("http://10.0.2.2/inmo_project_contreras/app/json/getPublicacionesDestacadasAlquiler.php"));
		
	}
	


	public List<Publicacion> getPublicacionesDestacadas() {
		return publicacionesDestacadas;
	}

	public void setPublicacionesDestacadas(List<Publicacion> publicacionesDestacadas) {
		this.publicacionesDestacadas = publicacionesDestacadas;
	}
	
	
}
